# 02 pytest记忆要点 ## 1. `pytest.fixture`(依赖注入与生命周期) * **基本用法**:用 `@pytest.fixture` 装饰函数,测试函数将其作为**同名参数**直接传入即可调用。 * **四种作用域**:通过 `scope` 参数控制执行频率。 * `function`(默认):每个测试函数执行前都运行一次。 * `class`:每个测试类运行前执行一次。 * `module`:每个 `.py` 脚本运行前执行一次。 * `session`:整个测试会话(所有文件)启动时只执行一次。 * **前后置清理**:在 fixture 内部使用 `yield` 分割。 * `yield` 之前的代码:测试前运行(Setup)。 * `yield` 之后的代码:测试后运行(Teardown),无论成功失败都会执行。 --- ## 2. 测试模块与分组(命名与标签) * **命名规范**:Pytest 依靠命名自动识别测试目标。 * 文件名:必须是 `test_*.py` 或 `*_test.py`。 * 类名:必须以 `Test` 开头,且**不能**有 `__init__` 方法。 * 函数/方法名:必须以 `test_` 开头。 * **分组标记**:使用 `@pytest.mark.标签名` 装饰器对测试进行分类。 * 示例:`@pytest.mark.slow` 标记耗时长的用例。 * 注意:自定义标签需在 `pytest.ini` 配置文件中注册,防止报警告。 --- ## 3. 部分范围测试(精确执行筛选) * **按路径与名称筛选**: * 执行目录/文件:`pytest test/backends/` 或 `pytest test_filesystem.py` * 精确到方法:`pytest test_file.py::TestClass::test_method` * **按表达式与标签筛选**: * 关键字筛选(`-k`):`pytest -k "filesystem and not read"`(支持逻辑运算符匹配名字)。 * 标签筛选(`-m`):`pytest -m "slow"` 或排除标签 `pytest -m "not slow"`。 --- ## 4. 全局配置文件 `conftest.py`(机制与自动执行时机) * **基本机制**:放置在测试根目录下的本地插件配置文件,无需手动 `import`,pytest 启动时会**自动探测并加载**。它内部的函数被称为钩子(Hooks)或全局夹具(Fixtures)。 * **核心 Hook 函数执行时机**: * **`pytest_configure(config)`**:整个测试会话最开始、所有测试用例加载(Import)之前。**(最适合:加载 `.env` 环境变量)**。 * **`pytest_sessionstart(session)`**:配置完成、在开始去硬盘寻找/收集测试文件之前。**(适合:初始化远程测试数据库等全局大对象)**。 * **`@pytest.fixture(scope="session", autouse=True)`**:在第一个测试用例运行前自动执行(通过 `yield` 分割前后置)。**(适合:整个测试周期的 Setup/Teardown,如清理临时文件夹)**。 * **`pytest_runtest_setup(item)`**:在**每一个**测试用例(函数)即将执行前触发。**(适合:条件检查,如无网时自动跳过线上测试)**。 * **`pytest_runtest_makereport(item, call)`**:在每个测试用例执行的各个阶段结束后触发。**(适合:捕获失败状态,如失败时自动截图或保存当前日志)**。 * **`pytest_sessionfinish(session, exitstatus)`**:所有测试用例全部执行完毕、报告生成之前。**(适合:断开全局连接、发送测试报告邮件)**。 --- ## 核心必背命令行参数与技巧 * **`-s`**:关闭标准输出捕获,让代码中的 `print()` 和日志实时显示在控制台。 * **`-v`**:详细模式(Verbose),显示每个测试用例的完整名称和执行状态。 * **`-x`**:一错即停(Maxfail=1),遇到第一个测试失败时立即停止后续所有测试。 * **异常捕获**:使用 `with pytest.raises(ExpectedException):` 检查代码是否如预期般抛出特定异常。